/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pio.action.coordinador;

import DBMS.DataBaseManager;
import DBMS.TableReader;
import clases.ArchivoExcel;
import clases.ArchivoExcelCoordinador;
import clases.Aspirante;
import clases.Coordinador;
import clases.Institucion;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.upload.FormFile;

/**
 *
 * @author tamerdark
 */
public class AgregarExcel extends DispatchAction {
    
    public ActionForward cargar(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
       DataBaseManager dbms = DataBaseManager.getInstance();
        Coordinador c= new Coordinador();
        c.setCedula((String)request.getSession().getAttribute("cedula"));
        ArrayList cs = dbms.consultarCoordinador(c);
        Iterator i = cs.iterator();
        Coordinador a = (Coordinador) i.next();
        request.setAttribute("instituciones", a.getInstituciones());
        ArchivoExcelCoordinador uploadForm = (ArchivoExcelCoordinador) form;
        String mensaje = "";
        ArrayList errores = new ArrayList();
        boolean cargaExitosa = true;
        try {
            String path = getPath(uploadForm);
            if (path.trim().endsWith("/") || path.trim().isEmpty()) {
                uploadForm.setMensaje("Seleccione un archivo");
                return mapping.findForward("failure");
            }
            TableReader table = new TableReader(new File(path));
            Aspirante[] tmp = new Aspirante[table.getMaxRows()];
            
            if (table.getMaxRows() > 1) {
                table.setRow(1); //table.read();// LEE ENCABEZADO
            } else {
                uploadForm.setMensaje("Archivo Vacio");
                return mapping.findForward("failure");
            }
            int fila = 0;
            int institucionId = uploadForm.getInstitucionId();
            System.out.println("Empezando a analizar archivo. La institucion es " + institucionId);
            while (table.hasNext()) {
                String[] h = table.read();
//                if (h.length == 0 || h[0].isEmpty()) {
//                    break;
//                }
                System.out.println("Analizando fila");
                Aspirante aspirante = new Aspirante();
                String cedula = (h.length > 0 ? h[0] : ""), apellidos = (h.length > 1 ? h[1] : ""), nombres = (h.length > 2 ? h[2] : "");                
                System.out.println("Estableciendo promedio");
                Double promedio = null;
                try {                    
                    if (h.length > 3 && h[3] != null && !h[3].trim().isEmpty()) {
                        System.out.println("Se intenta transformar " + h[3]);
                        promedio = Double.valueOf(h[3].trim().replace(',', '.'));
                    }                    
                } catch (NumberFormatException e) {
                    System.out.println("Error: el promedio contiene caracteres no numéricos");
                    // Agrego cualquier promedio invalido de manera que de error.
                    promedio = -20.0;
                }
                System.out.println("Asignando atributos");
                aspirante.setCedula(cedula);
                aspirante.setApellidos(apellidos);
                aspirante.setNombres(nombres);
                aspirante.setInstitucionId(institucionId);
                aspirante.setPromedio(promedio);
                tmp[fila] = aspirante;
                fila++;
            }
            System.out.println("Archivo analizado. Empezando a agregar en la BD");
            tmp[fila] = null;
            table.finish();
            fila = 0;
            while (fila < tmp.length && tmp[fila] != null) {
                System.out.println("Intentando agregar aspirante: " + tmp[fila].toString());
                if (!dbms.agregarAspirante(tmp[fila])) {
                    if (mensaje.isEmpty()) {
                        mensaje += "Error en el archivo en las lineas: ";
                    }
                    cargaExitosa = false;
                    mensaje += (fila + 2) + "\n";
                    errores.add(fila);
                }
                fila++;
            }
            if (cargaExitosa) {
                mensaje = "Carga finalizada con exito.";
            }
            uploadForm.setMensaje(mensaje);
            return mapping.findForward("success");
        } catch (Exception e) {
            mensaje = "Error: Archivo no soportado o Formato de Excel invalido";
            System.out.println(e);
            uploadForm.setMensaje(mensaje);
            return mapping.findForward("failure");
        }
    }
    
    private String getPath(ArchivoExcelCoordinador uploadForm) throws IOException {
        String path = "";
        FileOutputStream outputStream = null;
        FormFile formFile = null;
        try {
            formFile = uploadForm.getPath();
            path = getServlet().getServletContext().getRealPath("") + "/"
                    + formFile.getFileName();
            outputStream = new FileOutputStream(new File(path));
            outputStream.write(formFile.getFileData());
        } catch (Exception e) {
            // Do Nothing
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
        }
        return path;
    }
    
    public ActionForward populate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        DataBaseManager dbms = DataBaseManager.getInstance();
        Coordinador c= new Coordinador();
        c.setCedula((String)request.getSession().getAttribute("cedula"));
        ArrayList cs = dbms.consultarCoordinador(c);
        Iterator i = cs.iterator();
        Coordinador a = (Coordinador) i.next();
        request.setAttribute("instituciones", a.getInstituciones());
        return mapping.findForward("page");
    }
}
